/**
 * HTTP请求工具封装
 * 基于axios库封装的请求工具，包含请求和响应拦截器
 * 统一处理请求配置、错误提示和身份验证
 */

// 导入axios库
import axios from 'axios'

// 导入Element Plus的消息提示组件
import { ElMessage } from 'element-plus'

/**
 * 创建axios实例
 * 配置基础URL、超时时间和默认请求头
 */
const request = axios.create({
  // API接口的基础URL地址
  baseURL: 'http://127.0.0.1:3007',

  // 请求超时时间（毫秒）
  timeout: 10000,

  // 默认请求头配置
  headers: {
    'Content-Type': 'application/json'
  }
})

/**
 * 请求拦截器
 * 在发送请求之前做些什么
 */
request.interceptors.request.use(
  /**
   * 请求前处理函数
   * @param {Object} config - 请求配置对象
   * @returns {Object} 处理后的请求配置对象
   */
  (config) => {
    // 示例：从localStorage中获取登录令牌并添加到请求头
    const token = localStorage.getItem('token')
    if (token) {
      // 将令牌添加到Authorization请求头中
      config.headers.Authorization = `Bearer ${token}`
    }

    // 如果是文件上传，让浏览器自动设置Content-Type
    if (config.data instanceof FormData) {
      delete config.headers['Content-Type'];
    }

    return config
  },

  /**
   * 请求错误处理函数
   * @param {Error} error - 请求错误对象
   * @returns {Promise} 拒绝状态的Promise
   */
  (error) => {
    // 显示请求参数错误提示
    ElMessage.error('请求参数错误')
    return Promise.reject(error)
  }
)

/**
 * 响应拦截器
 * 对响应数据做点什么
 */
request.interceptors.response.use(
  /**
   * 响应成功处理函数
   * @param {Object} response - 响应对象
   * @returns {Object} 处理后的响应数据
   */
  (response) => {
    // 假设后端返回的数据格式：{ status: 0, message: '', data: ... }
    // status为0表示请求成功，非0表示请求失败
    const res = response.data

    // 判断请求是否成功
    if (res.status !== 0) {
      // 请求失败，显示错误消息
      ElMessage.error(res.message || '操作失败')
      return Promise.reject(res)
    }

    // 请求成功，返回完整的响应对象，以便前端可以访问分页信息等
    return res
  },

  /**
   * 响应错误处理函数
   * @param {Error} error - 响应错误对象
   * @returns {Promise} 拒绝状态的Promise
   */
  (error) => {
    // 获取HTTP状态码
    const status = error.response?.status

    // 根据不同的状态码显示相应的错误提示
    if (status === 401) {
      // 401未授权错误
      ElMessage.error('登录已过期，请重新登录')
      // 跳转到登录页（需导入 router）
      // router.push('/login')
    } else if (status === 404) {
      // 404接口不存在错误
      ElMessage.error('接口不存在')
    } else {
      // 其他网络错误
      ElMessage.error('网络错误，请稍后重试')
    }

    return Promise.reject(error)
  }
)

// 导出封装好的请求实例
export default request
